package main

import "fmt"

func foo3(i int) {
	var arr [10]int

	//recover()使用一定要在错误出现之前进行拦截
	defer func() {
		//recover可以从panic异常中重新获取控制权
		//revocer的调用必须要放在defer中
		err := recover()
		if err != nil {
			fmt.Println(err)
		}
	}()

	fmt.Println("发生panic前执行")

	a := 10
	var p *int
	p = &a
	fmt.Println(*p)

	//发生panic异常后的代码不会继续执行
	fmt.Println("发生panic后还会执行吗")

	//如果传递的参数超过9,导致数组下标越界,会触发panic异常,导致系统崩溃
	fmt.Println(arr[i])

	fmt.Println("panic后代码还会执行吗")
}

func foo4() {
	fmt.Println("测试recover后,函数还继续执行吗")
}

func main() {
	foo3(10)
	foo4()
}
